gtkmain: Don't use special paths for key event propagation
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 7 Mar 2018 16:59:22 +0000 (17:59 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 5 Apr 2018 17:26:54 +0000 (19:26 +0200)
Set the event_widget to the window focus, and let event capture/bubble
handling do the rest.

gtk/gtkmain.c
gtk/gtkwindow.c

index 9b0009e59cf38b8953ef7405b6301899e06d7886..6dea4284099530476129d8e20fb64037ce7cced7 100644 (file)
@@ -1682,6 +1682,16 @@ gtk_main_do_event (GdkEvent *event)
 
   if (is_pointing_event (event))
     event_widget = handle_pointing_event (event);
+  else if (GTK_IS_WINDOW (event_widget) &&
+           (event->any.type == GDK_KEY_PRESS ||
+            event->any.type == GDK_KEY_RELEASE))
+    {
+      GtkWidget *focus_widget;
+
+      focus_widget = gtk_window_get_focus (GTK_WINDOW (event_widget));
+      if (focus_widget)
+        event_widget = focus_widget;
+    }
 
   if (!event_widget)
     goto cleanup;
@@ -2451,59 +2461,14 @@ propagate_event_down (GtkWidget *widget,
   return handled_event;
 }
 
-static gboolean
-propagate_event (GtkWidget *widget,
-                 GdkEvent  *event,
-                 gboolean   captured,
-                 GtkWidget *topmost)
-{
-  gboolean handled_event = FALSE;
-  gboolean (* propagate_func) (GtkWidget *widget, const GdkEvent *event);
-
-  propagate_func = captured ? _gtk_widget_captured_event : gtk_widget_event;
-
-  if (event->any.type == GDK_KEY_PRESS || event->any.type == GDK_KEY_RELEASE)
-    {
-      /* Only send key events within Window widgets to the Window
-       * The Window widget will in turn pass the
-       * key event on to the currently focused widget
-       * for that window.
-       */
-      GtkWidget *window;
-
-      window = gtk_widget_get_toplevel (widget);
-      if (GTK_IS_WINDOW (window))
-        {
-          g_object_ref (widget);
-          /* If there is a grab within the window, give the grab widget
-           * a first crack at the key event
-           */
-          if (widget != window && gtk_widget_has_grab (widget))
-            handled_event = propagate_func (widget, event);
-
-          if (!handled_event &&
-              gtk_widget_is_sensitive (window))
-            handled_event = propagate_func (window, event);
-
-          g_object_unref (widget);
-          return handled_event;
-        }
-    }
-
-  /* Other events get propagated up/down the widget tree */
-  return captured ?
-    propagate_event_down (widget, event, topmost) :
-    propagate_event_up (widget, event, topmost);
-}
-
 void
 gtk_propagate_event_internal (GtkWidget *widget,
                               GdkEvent  *event,
                               GtkWidget *topmost)
 {
   /* Propagate the event down and up */
-  if (!propagate_event (widget, event, TRUE, topmost))
-    propagate_event (widget, event, FALSE, topmost);
+  if (!propagate_event_down (widget, event, topmost))
+    propagate_event_up (widget, event, topmost);
 }
 
 /**
index deb8d19927286f26e345d9a2be8da2f297e723d7..ffa266b6e8f5c88e274c35c644874ea4a6f11ad5 100644 (file)
@@ -433,8 +433,6 @@ static gboolean gtk_window_event          (GtkWidget         *widget,
                                            GdkEvent          *event);
 static gint gtk_window_key_press_event    (GtkWidget         *widget,
                                           GdkEventKey       *event);
-static gint gtk_window_key_release_event  (GtkWidget         *widget,
-                                          GdkEventKey       *event);
 static void gtk_window_focus_in           (GtkWidget         *widget);
 static void gtk_window_focus_out          (GtkWidget         *widget);
 static void surface_state_changed         (GtkWidget          *widget);
@@ -807,7 +805,6 @@ gtk_window_class_init (GtkWindowClass *klass)
   widget_class->size_allocate = gtk_window_size_allocate;
   widget_class->event = gtk_window_event;
   widget_class->key_press_event = gtk_window_key_press_event;
-  widget_class->key_release_event = gtk_window_key_release_event;
   widget_class->focus = gtk_window_focus;
   widget_class->move_focus = gtk_window_move_focus;
   widget_class->measure = gtk_window_measure;
@@ -7427,10 +7424,6 @@ gtk_window_key_press_event (GtkWidget   *widget,
   if (!handled)
     handled = gtk_window_activate_key (window, event);
 
-  /* handle focus widget key events */
-  if (!handled)
-    handled = gtk_window_propagate_key_event (window, event);
-
   /* Chain up, invokes binding set */
   if (!handled)
     handled = GTK_WIDGET_CLASS (gtk_window_parent_class)->key_press_event (widget, event);
@@ -7438,24 +7431,6 @@ gtk_window_key_press_event (GtkWidget   *widget,
   return handled;
 }
 
-static gint
-gtk_window_key_release_event (GtkWidget   *widget,
-                             GdkEventKey *event)
-{
-  GtkWindow *window = GTK_WINDOW (widget);
-  gboolean handled = FALSE;
-
-  /* handle focus widget key events */
-  if (!handled)
-    handled = gtk_window_propagate_key_event (window, event);
-
-  /* Chain up, invokes binding set */
-  if (!handled)
-    handled = GTK_WIDGET_CLASS (gtk_window_parent_class)->key_release_event (widget, event);
-
-  return handled;
-}
-
 static GtkWindowRegion
 get_active_region_type (GtkWindow *window, gint x, gint y)
 {